home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 2888 / 2888.xpi / content / addeditbookmark.js < prev    next >
Text File  |  2009-07-18  |  14KB  |  442 lines

  1. var GMS = Components.classes["@mozilla.org/gmarks;1"]
  2.   .getService(Components.interfaces.nsIGMarksService).wrappedJSObject;
  3. var prefs = Components.classes["@mozilla.org/preferences-service;1"].
  4.                             getService(Components.interfaces.nsIPrefService).getBranch("gmarks.");
  5. var strbundle = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService)
  6.           .createBundle("chrome://gmarks/locale/gmarks.properties");
  7.  
  8. var AllLabels;
  9. var bkmks=new Array();
  10. /* Editing */
  11. var originalBkmk=null;
  12. /* Auto Complete variables */
  13. var labelTextbox;
  14. var matched=new Array();
  15. var selStart;
  16. var selEnd;
  17. var position;
  18. var lblPopup=null;
  19. var cancelExit=false;
  20. /* Loading...
  21. The passed in grid is a grid element containing the gmarks elements
  22. in the editbookmark window, its the only grid
  23. in the addBookmarkOverlay, its the second grid
  24. */
  25. function  gmarksAddEditLoad(grid){
  26.   AllLabels=GMS.getLabels();
  27.   lblPopup=document.getElementById("labelAutoComplete-popup");
  28.   if (lblPopup==null)
  29.     lblPopup=document.getElementsByAttribute("id","labelAutoComplete-popup")[0];
  30. }
  31. /* Adding just one bookmark
  32. addeditmode, adding=0, editing=1
  33. The passed in grid is a grid element containing the gmarks elements
  34. */
  35. function gmarksAddEditBookmark(grid, addeditmode, aURL, aName, aLabels, aNotes, aMode){
  36.   var bkmk;
  37.   var menulist=null;
  38.   if (GMS.mode=="simpy"){//Show visibility option
  39.     var visRow=grid.getElementsByAttribute("id","visRow")[0];
  40.     visRow.setAttribute("hidden","false");
  41.     menulist=document.getElementsByAttribute("id","visList")[0];
  42.     menulist.selectedIndex=GMS.com.visibility;
  43.   }
  44.   if (addeditmode==1){
  45.     bkmk=GMS.createNewBookmark();
  46.     bkmk.title=aName;
  47.     bkmk.url=aURL;
  48.     bkmk.labels=aLabels;
  49.     bkmk.notes=aNotes;
  50.     bkmk.mode=aMode;
  51.   } else{
  52.     var index=GMS.isBookmarked(aURL);
  53.     if (index){
  54.       bkmk=GMS.bookmarkArray[index];
  55.       if (gArg){
  56.         gArg.name=bkmk.title;
  57.         gArg.labels=bkmk.labels;
  58.         gArg.description=bkmk.notes;
  59.       }
  60.     }
  61.     else{
  62.       bkmk=GMS.createNewBookmark(0,aURL,aName,aLabels,aNotes);
  63.     }
  64.     var selection=getBrowserSelection();
  65.     if (selection!=null && selection.length>0)
  66.       bkmk.notes=selection;
  67.   }
  68.   if (bkmk.mode!=null && bkmk.mode>-1 && menulist!=null){
  69.     menulist.selectedIndex=bkmk.mode;
  70.   }
  71.  
  72.   var txts=grid.getElementsByTagName("textbox");
  73.   var lblBox=txts[2];
  74.   loadFilters();
  75.   if (addeditmode==0){//aka adding, not editing.
  76.     bkmk=getSuggestedLabels(AllLabels,bkmk);
  77.     if (bkmk.newLabels && bkmk.newLabels.length>0){
  78.       if (bkmk.labels!=null && bkmk.labels.length!=0){
  79.         var lblLabels=grid.childNodes[1].childNodes[2].childNodes[1].childNodes[0].childNodes[0];//txts[2].previousSibling();//document.getElementById('lblLabels');
  80.         lblLabels.setAttribute('hidden','false');
  81.         lblLabels.value=bkmk.labels;
  82.       }
  83.  
  84.       lblBox.value=bkmk.newLabels+", ";
  85.       lblBox.setSelectionRange(0,lblBox.textLength);
  86.     }
  87.     else
  88.       lblBox.value=bkmk.labels;
  89.   }
  90.   else{
  91.     bkmk=checkFilters(bkmk);
  92.     lblBox.value=bkmk.labels;
  93.   }
  94.  
  95.   lblBox.focus();
  96.   labelTextBox=lblBox;
  97.   txts[0].value=bkmk.title;
  98.   txts[1].value=bkmk.url;
  99.   txts[3].value=bkmk.notes;
  100. }
  101. /* Adding multiple urls, generally from Ctrl+Shift+D */
  102. function gmarksAddBookmarks(grid){
  103.   loadFilters();
  104.   var rows=grid.getElementsByTagName("row");
  105.   var rowList=rows[0].parentNode;
  106.  
  107.   rowList.removeChild(rows[4]);
  108.   //rowList.removeChild(rows[3]);
  109.   rowList.removeChild(rows[1]);
  110.   rowList.removeChild(rows[0]);
  111.  
  112.   labelTextBox=grid.getElementsByTagName("textbox")[0];
  113.   labelTextBox.value="[Label Name]";
  114.  
  115.   var chkRow=document.createElement('row');
  116.   var chkFilters=document.createElement('checkbox');
  117.   chkFilters.setAttribute('label',strbundle.GetStringFromName('applyFilters'));
  118.   chkFilters.setAttribute('checked',"true");
  119.   chkFilters.setAttribute('id',"chkFilters");
  120.   chkRow.appendChild(document.createElement('spacer'));
  121.   chkRow.appendChild(chkFilters);
  122.   rowList.appendChild(chkRow);
  123. }
  124.  
  125. /* Saving Bookmark */
  126. function gmarksSaveBookmark(aID)
  127. {
  128.   var grid=document.getElementsByAttribute("id","gmarksgrid")[0];
  129.   var txts=grid.getElementsByTagName("textbox");
  130.  
  131.   var title=txts[0].value;
  132.   var url=txts[1].value;
  133.   if (!url || url=="") return false;//it has to have a url, other values are optional.
  134.   var labels="";
  135.   var lblLbls=txts[2].previousSibling.value;
  136.   var txtLbls=txts[2].value;
  137.   if (lblLbls){
  138.     labels=lblLbls;
  139.     if (txtLbls) labels+=","+txtLbls;
  140.     labels=labels.split(/,\s*/);
  141.   }
  142.   else if (txtLbls) labels=txtLbls.split(/,\s*/);
  143.   for (var i=0;i<labels.length;i++){
  144.     labels[i]=labels[i].replace(/^\s*|\s*$/g,"");
  145.     if (labels[i].length==0 || labels[i]==" " || labels[i].match(/^\s+$/))
  146.       labels.splice(i,1);
  147.   }
  148.   var notes=txts[3].value;
  149.   var visibility=GMS.visibility;
  150.   if (GMS.mode=="simpy"){
  151.     var visList=document.getElementsByAttribute("id","visList")[0]
  152.     visibility=visList.selectedIndex;
  153.   }
  154.   try{
  155.     if (gArg){
  156.       gName.value=title;
  157.       gArg.url=url;
  158.       gArg.description=notes;
  159.     }
  160.   }
  161.   catch(e){}
  162.   var bm=null;
  163.   var idx=-1;
  164.   if (originalBkmk){
  165.     if (originalBkmk.url!=url){
  166.       GMS.com.onRemoveBookmark(originalBkmk);
  167.     }
  168.     var idx=GMS.getBookmarkIndex(originalBkmk);
  169.     if (idx>-1){
  170.       bm=GMS.bookmarkArray[idx];
  171.       var origtitle=bm.title;
  172.       var obj2=new Array();
  173.       obj2.push({type: "title",title: originalBkmk.title});
  174.       obj2.push({type: "url",url: originalBkmk.url});
  175.       obj2.push({type: "labels",labels: originalBkmk.labels.toString()});
  176.       obj2.push({type: "notes",notes: originalBkmk.notes});
  177.       /* Create a bookmark action so it can be undone */
  178.       GMS.generateBkmkAction("bookmark","properties", bm,obj2);
  179.  
  180.       if (originalBkmk.url!=url) bm.id=0;
  181.       bm.url=url;
  182.       bm.title=title;
  183.       bm.labels=labels; bm.notes=notes;
  184.       bm.mode=visibility;
  185.       bm.date=new Date();
  186.       if ((bm.title!=origtitle && GMS.sortBy=="title") ||
  187.           GMS.sortBy=="date"){
  188.         //Move to new location
  189.         GMS.removeBookmark(idx);
  190.         GMS.addBookmark(bm);
  191.       }
  192.       else
  193.         GMS.updateRecent(bm);
  194.       GMS.sendUpdateBookmark(bm);
  195.       GMS.doCommand("quickrefresh");
  196.     }
  197.   }
  198.   if (idx<=-1){//New bkmk
  199.     bm=GMS.createNewBookmark(aID,url,title,labels,notes);
  200.     bm.mode=visibility;
  201.     GMS.tabGroup=[bm];
  202.     Components.classes["@mozilla.org/observer-service;1"]
  203.          .getService(Components.interfaces.nsIObserverService)
  204.          .notifyObservers(null, "star-change", "on");
  205.   }
  206.   return true;
  207. }
  208. /* Saving BookmarkS */
  209. function gmarksSaveBookmarks(){
  210.   var labels=labelTextBox.value.split(/\s*,\s*/);
  211.   for (var i=0;i<labels.length;i++){
  212.     labels[i]=labels[i].replace(/^\s*|\s*$/g,"");
  213.     if (labels[i].length==0 || labels[i]==" " || labels[i].match(/^\s+$/))
  214.       labels.splice(i,1);
  215.   }
  216.   var visibility=GMS.visibility;
  217.   if (GMS.mode=="simpy"){
  218.     var visList=document.getElementsByAttribute("id","visList")[0]
  219.     visibility=visList.selectedIndex;
  220.   }
  221.   var useFilters=document.getElementById('chkFilters').checked;
  222.   bkmks=new Array();
  223.   for (var i=0;i<gArg.objGroup.length;i++){
  224.     var bm=GMS.createNewBookmark(0,gArg.objGroup[i].url,
  225.                      gArg.objGroup[i].name,
  226.                      labels.slice(),"");
  227.     bm.mode=visibility;
  228.     if (useFilters) {
  229.       bm=getSuggestedLabels(AllLabels,bm);//Apply Filters
  230.       for (var b=0;b<bm.newLabels.length;b++){
  231.         bm.labels.push(bm.newLabels[b]);
  232.       }
  233.     }
  234.     bkmks.push(bm);
  235.   }
  236.   //setTimeout(function(){
  237.   Components.classes["@mozilla.org/observer-service;1"]
  238.          .getService(Components.interfaces.nsIObserverService)
  239.          .notifyObservers(null, "star-change", "on");
  240.   GMS.tabGroup=bkmks;
  241.   //},10);
  242.   return true;
  243. }
  244.  
  245. /* Auto Complete */
  246. function doLabelAutoComplete(){
  247.   var txtbox=labelTextBox;
  248.   var val=txtbox.value;
  249.   var point=txtbox.selectionEnd;
  250.   var end;
  251.   if (!txtbox.selectionStart!=point){
  252.     var curLabel="";
  253.     var pos=val.substring(0,point).lastIndexOf(",");
  254.     if (pos>-1){
  255.       if (pos<val.length-1){
  256.         curLabel=val.substring(pos+1,point).replace(/^\s*|\s*$/g,"");
  257.         start=pos+1;
  258.       }
  259.     }
  260.     else{
  261.       start=0;
  262.       curLabel=val.substring(0,point);
  263.     }
  264.     if (!curLabel==""){
  265.       curLabel=curLabel.toLowerCase();
  266.       matched=new Array();
  267.  
  268.       for(var i=0;i<AllLabels.length;i++){
  269.         var lbl=AllLabels[i].toLowerCase();
  270.         var pos2=lbl.indexOf(curLabel);
  271.         var match;
  272.         if (pos2==0 || (pos2>1 && ((match=lbl.substring(pos2-GMS.nestedChar.length,pos2))==GMS.nestedChar || match==" "))){
  273.           matched.push(AllLabels[i]);
  274.         }
  275.       }
  276.       selStart=start; selEnd=point;
  277.       if (matched.length>0)
  278.         createAndShowPopup(curLabel,txtbox);
  279.       else{
  280.         matched=new Array();
  281.         lblPopup.hidePopup();
  282.       }
  283.     }
  284.     else{
  285.       matched=new Array();
  286.       lblPopup.hidePopup();
  287.     }
  288.   }
  289.   else{
  290.     matched=new Array();
  291.     lblPopup.hidePopup();
  292.   }
  293. }
  294. /* Auto Complete popup */
  295. function createAndShowPopup(current,parent){
  296.   for (var i=lblPopup.childNodes.length-1;i>=0;i--){
  297.     lblPopup.removeChild(lblPopup.childNodes[i]);
  298.   }
  299.   position=0;
  300.   for (var i=0;i<matched.length;i++){
  301.     var vbox=document.createElement("vbox");
  302.     vbox.setAttribute("flex","1");
  303.     vbox.setAttribute("style","padding: 2px;");
  304.     var mainlbl=document.createElement("label");
  305.     mainlbl.setAttribute("value",matched[i]);
  306.     vbox.appendChild(mainlbl);
  307.     vbox.setAttribute("onclick",'lblComplete("'+matched[i]+'");');
  308.     vbox.setAttribute("onmouseover",'onMouseOver('+i+');');
  309.     if (i==0)
  310.       vbox.className="gmPopupSelected";
  311.     else
  312.       vbox.className="gmPopupNormal";
  313.     lblPopup.appendChild(vbox);
  314.   }
  315.  
  316.   lblPopup.showPopup(parent,parent.boxObject.screenX,parent.boxObject.screenY+parent.boxObject.height,"popup");
  317. }
  318. function handleKeypress(event){
  319.   var keycode=event.keyCode;
  320.   if (keycode==13){
  321.     //Enter
  322.     if (matched.length>0){
  323.       lblComplete(matched[position]);
  324.       event.stopPropagation();
  325.       cancelExit=true;
  326.     }
  327.   }
  328.   else if (keycode==38){
  329.     //Up
  330.     lblPopup.childNodes[position].className="gmPopupNormal";
  331.     position--;
  332.     if (position<0) position=matched.length-1;
  333.     lblPopup.childNodes[position].className="gmPopupSelected";
  334.   }
  335.   else if (keycode==40){
  336.     //Down
  337.     lblPopup.childNodes[position].className="gmPopupNormal";
  338.     position++;
  339.     if (position>=matched.length) position=0;
  340.     lblPopup.childNodes[position].className="gmPopupSelected";
  341.   }
  342.   event.stopPropagation();
  343. }
  344. function onMouseOver(i){
  345.   lblPopup.childNodes[position].className="gmPopupNormal";
  346.   position=i;
  347.   lblPopup.childNodes[position].className="gmPopupSelected";
  348. }
  349. function lblComplete(label){
  350.   var txtbox=labelTextBox;
  351.   var val=txtbox.value;
  352.   txtbox.value=val.substring(0,selStart)+label+", "+val.substring(selEnd);
  353.   matched=new Array();
  354.   lblPopup.hidePopup();
  355. }
  356. function hidePopup(){
  357.   if (lblPopup!=null)
  358.     lblPopup.hidePopup();
  359. }
  360.  
  361. /* Filters && Suggestions */
  362. function getSuggestedLabels(allLabels, bkmk){
  363.   var prefs = Components.classes["@mozilla.org/preferences-service;1"].
  364.                             getService(Components.interfaces.nsIPrefService).getBranch("gmarks.");
  365.   if (prefs.getBoolPref('suggest')==true){
  366.     var suggested=new Array();//Array of labels that might fit the current bookmark.
  367.     var cTitle=bkmk.title.toLowerCase();
  368.     var titleParts=cTitle.replace("-"," ").split(/\s+/);
  369.     for (var i=0;i<allLabels.length;i++){
  370.       var regexp=new RegExp(GMS.nestedChar);
  371.       var lblWords=allLabels[i].split(regexp);
  372.       if (cTitle==allLabels[i].toLowerCase()){
  373.         suggested.push(allLabels[i]);
  374.       }
  375.       else{
  376.         var hasmatch=false;
  377.         lblWords.forEach(function(word,index,arr){
  378.           var matched=false;
  379.           titleParts.forEach(function(part,index2,arr2){
  380.             if (part==word.toLowerCase() && !matched){
  381.               matched=true;
  382.               var newlbl=arr[0];
  383.               for(var j=1;j<=index;j++)
  384.                 newlbl+=GMS.nestedChar+arr[j];
  385.  
  386.               if (suggested.indexOf(newlbl)==-1)
  387.                 suggested.push(newlbl);
  388.             }
  389.           });
  390.           if (matched && index>0 && hasmatch){
  391.             suggested.splice(suggested.length-2,1);
  392.           }
  393.           else if (matched) hasmatch=true;
  394.         });
  395.       }
  396.     }
  397.     //Make sure we don't suggest a label thats already added
  398.     for (var i=0;i<bkmk.labels.length;i++){
  399.       for (var j=0;j<suggested.length;j++){
  400.         if (suggested[j]==bkmk.labels[i]){
  401.           suggested.splice(j,1);
  402.           break;
  403.         }
  404.       }
  405.     }
  406.     bkmk.newLabels=suggested;
  407.   }
  408.   bkmk=checkFilters(bkmk);
  409.   return bkmk;
  410. }
  411.  
  412. function checkFilters(bkmk){
  413.   for (var i=0;i<filters.length;i++){
  414.     if (filters[i].matches(bkmk)){
  415.       bkmk=filters[i].applyFilter(bkmk);
  416.     }
  417.   }
  418.   return bkmk;
  419. }
  420.  
  421. /* Util Functions */
  422. function getBrowserSelection(){
  423.   var w=getTopWin();
  424.   var browser = w.document.getElementById("content");
  425.   return w.content.getSelection().toString();
  426. }
  427. function getTopWin()//For the notes!
  428. {
  429.     var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService();
  430.     var windowManagerInterface = windowManager.QueryInterface( Components.interfaces.nsIWindowMediator);
  431.     var topWindowOfType = windowManagerInterface.getMostRecentWindow( "navigator:browser" );
  432.  
  433.     if (topWindowOfType) {
  434.         return topWindowOfType;
  435.     }
  436.     return null;
  437. }
  438.  
  439. function d(s){
  440.   //dump(s+'\n');
  441. }
  442.